package com.example.liyun.joy;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

import org.w3c.dom.Attr;

/**
 * 自定义分割线
 */
public class MyItemDecoration extends RecyclerView.ItemDecoration {
    //创建画笔
    private Paint mPaint;
    private Drawable mDivider;//分割器
    private int mDividerheight=2;//分割先高度，默认为1px
    private int mOrientation;//列表方向：LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL
    //使用系统自带的listDivider
    private static final int[] ATTRS=new int[]{android.R.attr.listDivider};

    /**
     * 创建构造方法，默认分割线：高度为2px，颜色为灰色
     * @param context
     * @param orientation  列表方向
     */
    public MyItemDecoration(Context context,int orientation){
        //判断是否有输入列表方向
        if(orientation!=LinearLayoutManager.VERTICAL&&orientation!=LinearLayoutManager.HORIZONTAL){
            throw new IllegalArgumentException("请输入正确的参数！");
        }
        mOrientation=orientation;
        //使用TypeArray加载该系统资源,设置为系统默认分割线
        final TypedArray a=context.obtainStyledAttributes(ATTRS);
        mDivider=a.getDrawable(0);//将样式设置到Drawable中
        a.recycle();//缓存分割线样式
    }

    /**
     * 利用布局图片填充自定义分割线
     * @param context
     * @param orientation  列表方向
     * @param drawableId   填充分割线图片
     */
    public MyItemDecoration(Context context,int orientation,int drawableId){
        this(context,orientation);
        //获取填充分割线的图片
        mDivider=ContextCompat.getDrawable(context,drawableId);
        //获取图片高度
        mDividerheight=mDivider.getIntrinsicHeight();
    }

    /**
     * 利用画笔绘制自定义分割线
     * @param context
     * @param orientation  列表方向
     * @param dividerHeight  绘制分割线高度
     * @param dividerColor   绘制分割线颜色
     */
    public MyItemDecoration(Context context,int orientation,int dividerHeight,int dividerColor){
        this(context,orientation);
        //得到分割线高度
        mDividerheight=dividerHeight;
        //创建画笔,并设置画笔标志：Paint.FILTER_BITMAP_FLAG是使位图过滤的位掩码标志
        //Paint.ANTI_ALIAS_FLAG是使位图抗锯齿的标志
        //Paint.DITHER_FLAG是使位图进行有利的抖动的位掩码标志
        mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        //设置画笔颜色
        mPaint.setColor(dividerColor);
        //设置画笔样式,充满
        mPaint.setStyle(Paint.Style.FILL);
    }
    /**
     * 自定义分割线绘制
     * @param c   画布
     * @param parent
     * @param state
     */
    @Override
    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDraw(c, parent, state);
        //判断列表方向，然后为其画出分割线方向
        if(mOrientation==LinearLayoutManager.VERTICAL){
            drawVertical(c,parent);
            Log.d("onDraw","进入onDraw");
        }else {
            drawHorizontal(c,parent);
        }

    }

    /**
     * 绘制横向 Item 分割线
     * @param c
     * @param parent
     */
    private void drawHorizontal(Canvas c, RecyclerView parent) {
        //获取分割线的左边距 ，即recycleView 的padding值
        final int left=parent.getPaddingLeft();
        //获取分割线的右边距    --------这里需要注意，还不是很理解
        final int right=parent.getMeasuredWidth()-parent.getPaddingRight();
        //获取recycleview有多少个item，item总数
        final int childSize=parent.getChildCount();
        //遍历所有的item view，为其下方绘制分割线
        for (int i=0;i<childSize;i++){
            //得到一个item
            final View child=parent.getChildAt(i);
            //得到item在recycleView中的位置信息
            RecyclerView.LayoutParams layoutParams= (RecyclerView.LayoutParams) child.getLayoutParams();
            //这里有一个问题：最后一个item绘制分割线会导致高度不一致
            //获取绘制分割线顶部的位置
            final int top=child.getBottom()+layoutParams.bottomMargin;
            //获得绘制分割线底部的位置
            final int bottom=top+mDividerheight;
            //判断是否存在分割器
            if (mDivider!=null){
                //设置分割器区域
                mDivider.setBounds(left,top,right,bottom);
                //设置画布的大小
                mDivider.draw(c);
            }
            //判断画笔是否存在，并开始画分割线
            if (mPaint!=null){
                c.drawRect(left,top,right,bottom,mPaint);
                Log.d("Canvas","执行了");
            }
        }
    }

    /**
     * 绘制纵向 Item 分割线
     * @param c
     * @param parent
     */
    private void drawVertical(Canvas c, RecyclerView parent) {
        //获取分割线的顶部边距  即recycleView 的padding值
        final int top=parent.getPaddingTop();
        //获取分割线的底部边距
        //final int bottom=parent.getMeasuredHeight()-parent.getPaddingBottom();
        //获取recycleview的Item总数
        final int childSize=parent.getChildCount();
        //遍历所有的Item，为其右侧绘制分割线
        for (int i=0;i<childSize;i++){
            //得到一个Item布局
            final View child=parent.getChildAt(i);
            //得到item在recycleView中的位置信息
            RecyclerView.LayoutParams layoutParams= (RecyclerView.LayoutParams) child.getLayoutParams();
            //获取分割线的底部边距位置，注意：这里是Item的高度
            final int bottom=child.getMeasuredHeight()-child.getPaddingBottom();
            //获取绘制分割线的左边位置(右侧位置+右边距)
            final int left=child.getRight()+layoutParams.rightMargin;
            //获取绘制分割线的右边位置
            final int right=left+mDividerheight;
            //判断分割器不为空
            if (mDivider!=null){
                mDivider.setBounds(left,top,right,bottom);
                mDivider.draw(c);
            }
            //判断画笔是否为空,并开始绘制分割线
            if (mPaint!=null){
                c.drawRect(left,top,right,bottom,mPaint);
                Log.d("Canvas",String.valueOf(bottom));
            }

        }
    }

    @Override
    public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
        //判断列表方向，然后为其画出分割线方向
        if(mOrientation==LinearLayoutManager.VERTICAL){
            drawVertical(c,parent);
        }else {
            drawHorizontal(c,parent);
        }
    }

    /**
     * 获取分割线尺寸
     * @param outRect
     * @param view
     * @param parent
     * @param state
     */
    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        //设置偏移的高度是mDivider.getIntrinsicHeight，该高度正是分割线的高度
        //outRect.set(0,0,0,mDividerheight);
        /* outRect.set(left, top, right, bottom);
       Item的四周间距
       垂直时，Item的下方预留出分割线的高度
       水平时，Item的右方预留出分割线的宽度*/
        if (mOrientation == LinearLayoutManager.VERTICAL) {
            Log.d("mDivider",String.valueOf(mDividerheight));
            outRect.set(0, 0, 0, mDividerheight);

        } else {
            outRect.set(0, 0, mDividerheight, 0);
        }

    }
}
